Soru & Cevap

LibGdx Oyun Kütüphanesi Texture Değiştirme

16.11.2015 - 10:25

Merhaba,

Libgdx oyun kütüphanesini kullanarak ufak çaplı bir oyun yazmaya çalışıyorum. Bu kütüphanenin kendi tanıtımlarından Damla Yakalama Oyunu, 'A Simple Game' https://github.com/libgdx/libgdx/wiki/A-simple-game . Buradan yola çıkarak bazı değişiklikler yapmaya çalışıyorum.

Oyunun tüm kodları şu şekildedir.


import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;


import java.util.Iterator;


public class Baloncuk implements ApplicationListener {

   //Değişkenler
   private OrthographicCamera kamera; //kamera
   private SpriteBatch tuval; //Görünmez Tuval.
   private Texture rsmKova; //Kova resmi.
   private Rectangle rctKova;//Resmin bağlı olduğu görünmez dikdörtgen.
   private Texture rsmDamla; //Damla resmi.
   private Array<Rectangle> damlalar;
   private long sonDamlamaZamani;
   private Sound sesDamla; //Damla sesi.





   @Override
   public void create() {

      //Kamerayı tanımlıyoruz.
      kamera = new OrthographicCamera();
      kamera.setToOrtho(false, 800, 480);

      //Resimler.
      rsmKova = new Texture(Gdx.files.internal("rsmkova.png"));
      rsmDamla = new Texture(Gdx.files.internal("rsmdamla.png"));

      //Dikdörtgenler.
      rctKova = new Rectangle();
      rctKova.width = 64;
      rctKova.height = 64;
      rctKova.x = 800 / 2 - rctKova.width / 2;
      rctKova.y = 20;

      //Sesler.
      sesDamla = Gdx.audio.newSound(Gdx.files.internal("sesdamla.mp3"));

      damlalar = new Array<Rectangle>();

      //Tuval
      tuval = new SpriteBatch();

      damlaUret();


   }

   private void damlaUret(){

      Rectangle rctDamla = new Rectangle();
      rctDamla.width = 45;
      rctDamla.height = 68;
      rctDamla.x = MathUtils.random(0 , 800 - 45);
      rctDamla.y = 480;
      damlalar.add(rctDamla);
      sonDamlamaZamani = TimeUtils.nanoTime();

   }

   @Override
   public void render() {

      //Ekran arkaplanı boyar.
      Gdx.gl.glClearColor(1.0f, 1.0f, 1.0f, 1);
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

      //Kamera Güncelleme
      kamera.update();

      //Tuval-Kamera ayarı
      tuval.setProjectionMatrix(kamera.combined);


      tuval.begin();

      tuval.draw(rsmKova, rctKova.x, rctKova.y);

      for(Rectangle rctDamla : damlalar){
         tuval.draw(rsmDamla, rctDamla.x, rctDamla.y);
      }



      tuval.end();


      //Kova dokunduğum yere gelsin
      if (Gdx.input.isTouched()){

         // (x, y, z) 3 boyutlu vektör.
         Vector3 dokunmaPozisyonu = new Vector3();

         //Vektöre dokunulan kordinatları veriyoruz.
         dokunmaPozisyonu.set(Gdx.input.getX(), Gdx.input.getY(), 0);

         //Kordinatları oyuna uyarlar.
         kamera.unproject(dokunmaPozisyonu);



         //Kovayı taşır.
         rctKova.x = dokunmaPozisyonu.x - rctKova.width / 2;
         rctKova.y = dokunmaPozisyonu.y - rctKova.height / 2;


      }



      if (TimeUtils.nanoTime() - sonDamlamaZamani > 1000000000){
         damlaUret();
      }

      Iterator<Rectangle> damla = damlalar.iterator();
      while (damla.hasNext()){
         Rectangle rctDamla = damla.next();
         rctDamla.y -= 200*Gdx.graphics.getDeltaTime();
         if (rctDamla.y + 45 < 0){
            damla.remove();
         }

         //Damla >> kovaya çarptığında ses çıkar.
         if (rctDamla.overlaps(rctKova)){
            sesDamla.play();
            damla.remove();
         }
      }


   }

   @Override
   public void dispose() {
      rsmDamla.dispose();
      rsmKova.dispose();
      sesDamla.dispose();
      tuval.dispose();
   }


   @Override
   public void resize(int width, int height) {

   }

   @Override
   public void pause() {

   }

   @Override
   public void resume() {

   }


}

Burada yapmak istediğim yukarıdan kayan damla texture'ının üzerine dokunduğumda bir başka texture'a (resime) dönüşmesini nasıl sağlayabilirim.

Bir diğer konu, damlaUret metodu ile sonsuz sayıda random damla texture'ı üretilmektedir. Bu damlaların sayısını sınırlandırabilir miyim? Örn: 20 adet damla gelmeli sadece ve benim belirlediğim koordinatlardan yine belirlemiş olduğum bir başka koordinata doğru ilerlemeli. Libgdx ile ilgili kaynaklar son derece sınırlı, bu yüzden konu açma gereği duydum. Yardımcı olabilirseniz sevinirim.

98 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user denzcoskun
denzcoskun
15.05.2016 - 09:41

20 Damla Sınırlaması:

Baloncuk class'ının hemen başında 

private int sayac=0;

 tanımlanır ve aşağıdaki if kısmı şeklinde değiştirilir.

if (TimeUtils.nanoTime() - sonDamlamaZamani > 1000000000 && sayac<=20){
         damlaUret();
         sayac++;
}

Texture Değiştirme:

 

Bu kod yapısında yapılması zor.